package com.liezh.abstract_factory;

import com.liezh.abstract_factory.factory.MotifWidgetFactory;
import com.liezh.abstract_factory.factory.PMWidgetFactory;
import com.liezh.abstract_factory.factory.WidgetFactory;

/**
 * 抽象工厂这种设计模式在spring中也有大量的使用
 * 最常见的应用场景就是 依赖注入
 * spring的配置文件所到底就是一个说明实例工厂和产品创建关系的文件
 * 也就是一个大型的抽象工厂
 */
public class Client {

    public static void main(String[] args) {
        // 可以把下列示例变为一个个读取配置文件的创建类
        // 因为都是同一个抽象工厂，具体的实例工厂和生成的产品是什么
        // 其实系统中并不关心，所以在这时可以通过配置的形式来限定具体创建的实例工厂
        // 就如 设计模式_可复用面向对象软件的基础 这本书的例子一般
        // 在文本编辑器在不同系统中运行时，由于用户的系统设置，会有不同的视感。
        // 这时在启动时就可以通过创建不同的具体视感的工厂（MotifWidgetFactory / PMWidgetFactory），
        // 生成不同样式的组件。
        WidgetFactory factory = new MotifWidgetFactory();
        factory.createScrollBar();
        factory.createWindow();

        WidgetFactory factory1 = new PMWidgetFactory();
        factory1.createScrollBar();
        factory1.createWindow();
    }
}
